package es.exitae.ejerciciofinal;

import static es.exitae.ejerciciofinal.utils.Constantes.CODIGO_NUEVO_LUGAR;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_ID_LUGAR;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_LATITUD;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_LONGITUD;
import static es.exitae.ejerciciofinal.utils.Constantes.TAG_REQUEST_CODE;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import es.exitae.ejerciciofinal.dto.CargaDTOs;
import es.exitae.ejerciciofinal.dto.LugarDTO;
import es.exitae.ejerciciofinal.provedorCont.EjercicioFinalProvider;
import es.exitae.ejerciciofinal.provedorCont.tablas.Lugares;
import es.exitae.ejerciciofinal.servicios.ServicioGeolocalizacion;
import es.exitae.ejerciciofinal.utils.Traza;
import es.exitae.ejerciciofinal.utils.enums.Metodo;
import es.exitae.pirateplace.R;

public class MapaLugaresActivity extends FragmentActivity implements OnMapClickListener, OnMarkerClickListener, LocationListener
{
	private CargaDTOs cargar;
	private GoogleMap mapa;
	private BitmapDescriptor iMarca;
	
	private ServicioGeolocalizacion geolocalizacion;
	
	/**
	 * Limpia el mapa y vuelve a generar todas las marcas guardadas en la BD
	 */
	private void cargarMarcasMapa()
	{
		Traza.d(Metodo.ENTRADA);
		Uri url = Uri.parse(EjercicioFinalProvider.LUGARES_URI);
		
		String[] projection = {Lugares.COL_NOMBRE, Lugares.COL_LATITUD, Lugares.COL_LONGITUD};
		
		Cursor resultado = getContentResolver().query(url, projection, null, null, Lugares.DEFAULT_SORT_ORDER);
		
		if(resultado.moveToFirst())
		{
			mapa.clear();
			do
			{
				MarkerOptions marca = new MarkerOptions();
				marca.position(new LatLng(resultado.getDouble(1), resultado.getDouble(2)));
				marca.title(resultado.getString(0));
				marca.icon(iMarca);
				
				mapa.addMarker(marca);
			}while(resultado.moveToNext());
		}
		Traza.d(Metodo.SALIDA);
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		Traza.d(Metodo.ENTRADA);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mapa_activity);
		
		mapa = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
		mapa.setMapType(GoogleMap.MAP_TYPE_NORMAL);
		mapa.setMyLocationEnabled(true);
		mapa.setOnMapClickListener(this);
		mapa.setOnMarkerClickListener(this);
		
		cargar = new CargaDTOs(getContentResolver());
		
		LocationManager locationManaget = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		geolocalizacion = new ServicioGeolocalizacion(locationManaget);
		geolocalizacion.cargarUltimaPosicionConocida();
		geolocalizacion.setZoon(14);
		geolocalizacion.actualizarMapa(mapa);
		
		iMarca = BitmapDescriptorFactory.fromResource(R.drawable.calabera_pirata);
		
		Traza.d(Metodo.SALIDA);
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.mapa, menu);
		return true;
	}
	
	@Override
	public void onLocationChanged(Location loc)
	{
		geolocalizacion.setPosicion(loc);
	}
	
	@Override
	public void onMapClick(LatLng arg0)
	{
		Traza.d(Metodo.ENTRADA);
		Intent i = new Intent(this, EditarLugarActivity.class);
		i.putExtra(TAG_LATITUD, arg0.latitude);
		i.putExtra(TAG_LONGITUD, arg0.longitude);
		i.putExtra(TAG_REQUEST_CODE, CODIGO_NUEVO_LUGAR);
		
		startActivityForResult(i, CODIGO_NUEVO_LUGAR);
		Traza.d(Metodo.SALIDA);
	}
	
	@Override
	public boolean onMarkerClick(Marker marker)
	{
		Traza.d(Metodo.ENTRADA);
		LugarDTO lugar = new LugarDTO();
		lugar.setNombre(marker.getTitle());
		lugar.setCoodenadas(marker.getPosition());
		
		int idLugar = cargar.getID(lugar);
		
		if(idLugar > 0)
		{
			Intent i = new Intent(this, MostrarLugarActivity.class);
			i.putExtra(TAG_ID_LUGAR, idLugar);
			
			startActivity(i);
		}else
		{
			Traza.w("ID no valido: " + idLugar);
			Toast.makeText(this, "lo sentimos no se pudo cargar el Lugar", Toast.LENGTH_SHORT).show();
		}
		
		Traza.d(Metodo.SALIDA);
		return idLugar > 0;
	}
	
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item)
	{
		Traza.d(Metodo.ENTRADA);
		switch(item.getItemId())
		{
			case R.id.menuMapa_H:
				mapa.setMapType(GoogleMap.MAP_TYPE_HYBRID);
				break;
			case R.id.menuMapa_N:
				mapa.setMapType(GoogleMap.MAP_TYPE_NORMAL);
				break;
			case R.id.menuMapa_T:
				mapa.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
				break;
			case R.id.menuMapa_S:
				mapa.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
				break;
			default:
				return false;
		}
		Traza.d(Metodo.SALIDA);
		return true;
	}
	
	@Override
	public void onProviderDisabled(String provider)
	{
		
	}
	
	@Override
	public void onProviderEnabled(String provider)
	{
		
	}
	
	@Override
	protected void onResume()
	{
		Traza.d(Metodo.ENTRADA);
		super.onResume();
		cargarMarcasMapa();
		Traza.d(Metodo.SALIDA);
	}
	
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras)
	{
		
	}
	
}
